﻿using System;
//try语句和异常
//try语句时为了处理错误或清理代码而定义的语句块。
//try块后面必须跟有catch块或finally块或两个块都有。
//当try块执行发生错误时，执行catch块；当结束try块时（如果当前是catch块，则当结束catch块时），不管有没有发生错误，都执行finally块来清理代码。

//catch块可以访问Exception对象，该对象包含错误信息。catch中可以弥补错误也可以再次抛出异常。当仅仅时记录错误或要抛出更高层次的错误时，我们选择再次抛出异常。
//finally块在程序中起决定作用，因为任何情况下它都被执行，通常用于清除任务，例如关闭网络连接等。
/*
try语句举例如下：
try
{
    ... // 在执行本代码块时，可以抛出异常
}
catch(ExceptionA ex)
{
    ... // 处理ExceptionA类型的异常
}
catch(ExceptionB ex)
{
    ... // 处理ExceptionB类型的异常
}
finally
{
    ... // 清除代码   
}
 
 */
namespace _102_try语句和异常
{
    class Test
    {
        static int Calc(int x) { return 10 / x; }

        static void Main(string[] args)
        {
            try
            {
                int y = Calc(0);
                Console.WriteLine(y);
            }
            catch(DivideByZeroException ex)
            {
                Console.WriteLine("x cannot be zero");
            }
            Console.WriteLine("program completed");
            //提示：上面时为了阐述异常处理举例的简单实例。在实际工作中，更好的处理方法时在调用Calc前显式检查除数是否为0。
            //异常处理需要几百个时钟周期，代价相对较高。

            //当抛出异常时，公共语言运行时CLR询问：当前是否在能捕获异常的try语句块中运行？
            //    如果是，执行转到相应的catch块，如果catch块成功地运行结束，执行转到try下面的语句（如果存在，finally块优先执行）。
            //    如果否，执行跳转到调用函数，重复上述询问（在执行finally块之后）。
            //如果没有用于异常处理的函数，用户将看到一个错误提示框，并且程序终止。

            Console.ReadKey();
        }
    }
}
